/* 约数个数
* 1.N的约数个数(1~N中能整除N的个数 N%x == 0)
    N = p1^c1 * p2^c2 * p3^c3 * p4^c4... pk^ck
    f(N) = (c1+1) * (c2+2) * (c3+3) ... * (ck+k)

    1~N中 累加(1~N)f(i) O(NlogN)

    0 <= N <= 2e9 约数个数max <= 5e4

    for(int i = 1; i < N; i++){
        if(cnt[i] == 0) continue; //优化
        for(int j = i; j < N; j+=i)  //只考虑倍数 
            ans[j] += cnt[i];
    }

* 本题:
    gcd(a, x) == b
    lcm(c, x) == d -> x一定是d的约数
    枚举所有d的约数

    1~n中的质数个数约为n/ln(n)
*/

#define DEBUG
#pragma GCC optimize("O1,O2,O3,Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
#define int long long
using PII = pair<int, int>;

const int N = 5e4+10;
int n;
int primes[N], cnt;
bool st[N];
PII factor[N]; //存储 b1 的所有质因子及个数
int divider[N]; //记录 b1 的所有约数
int cntf, cntd;

inline int gcd(int a, int b) //最大公约数
{
    return b ? gcd(b, a % b) : a;
}

void init(int n) //找质数
{
    for(int i = 2; i <= n; i++){
        if(!st[i]) primes[cnt++] = i;
        for(int j = 0; primes[j]*i <= n; j++)
        {
            st[primes[j]*i] = true;
            if(i % primes[j] == 0) break;
        }
    }
}

void dfs(int u, int p) //拼凑所有的约数
{
    if(u == cntf)
    {
        divider[cntd++] = p;
        return;
    }
    for(int i = 0; i <= factor[u].second; i++)
    {
        dfs(u+1, p);
        p *= factor[u].first;
    }
}

signed main()
{
    #ifdef DEBUG
        freopen("./in.txt", "r", stdin);
    #else
        ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #endif

    init(N-1);

    int n; cin >> n;
    while(n--)
    {
        int a, b, c, d; cin >> a >> b >> c >> d;

        cntf = 0;
        int t = d;
        for(int i = 0; primes[i] <= t / primes[i]; i++) //分解质因子
        {
            int p = primes[i];
            if(t % p == 0)
            {
                int s = 0;
                while(t % p == 0) t /= p, s++; //把每一个质因子除尽
                factor[cntf++] = {p, s};
            }
        }
        if(t > 1) factor[cntf++] = {t, 1}; //可能存在(仅一个)一个>sqrt(x)的质因子

        // 用d的所有质因子，拼凑d的所有约数
        cntd = 0;
        dfs(0, 1);

        int res = 0;
        for(int i = 0; i < cntd; i++)
        {
            int x = divider[i];
            if(gcd(x, a) == b && x * c / gcd(x, c) == d) res++;
        }
        cout << res << endl;
    }
    return 0;
}